/*******************************************
  Jose Andres Lara Vecino

  Author       : $Author: cainlara@gmail.com $
  Last CheckIn : $Date: 2012-08-22 18:35:06 +0000 (Wed, 22 Aug 2012) $
  Revision     : $Revision: 100 $
*******************************************/

package gui;

import generico.GenericoAccion;
import generico.GenericoTablaListado;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.List;

import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;
import javax.swing.LayoutStyle.ComponentPlacement;

import utilidad.IPropiedades;

/**
 * Contenedor de seccion.
 * <P>
 * Este panel, es la super clase para los paneles 
 * usados como contenedor principale en cada una 
 * de las secciones. Contiene una tabla que lista 
 * la totalidad de objetos en el sistema, dependiendo 
 * de la seccion en la que se implemente.
 * 
 * @author jose.lara 09.06.2012
 */
public abstract class SeccionPanel extends JPanel {
    private static final long serialVersionUID = 1L;
    
    private JScrollPane scrollPanel                     = null;
    private SeccionDescripcionPanel descripcionPanel    = null;
    private int tipo                                    = PanelPrincipal.OPCION_DEFAULT;
    private JToolBar barraHerramientas                  = null;
    private PanelTablaVacia panelVacio                  = null;
    protected GenericoTablaListado tabla                  = null;
    
    public SeccionPanel(int tipo) {
        super();
        this.tipo = tipo;
        
        GroupLayout groupLayout = new GroupLayout(this);
        groupLayout.setHorizontalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addComponent(getBarraHerramientas(), GroupLayout.DEFAULT_SIZE, 450, Short.MAX_VALUE)
                .addComponent(getScrollPanel(), GroupLayout.DEFAULT_SIZE, 450, Short.MAX_VALUE)
                .addComponent(getDescripcionPanel(), GroupLayout.DEFAULT_SIZE, 450, Short.MAX_VALUE)
        );
        groupLayout.setVerticalGroup(
            groupLayout.createParallelGroup(Alignment.LEADING)
                .addGroup(groupLayout.createSequentialGroup()
                    .addComponent(getDescripcionPanel(), GroupLayout.PREFERRED_SIZE, 38, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(getBarraHerramientas(), GroupLayout.PREFERRED_SIZE, 29, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(getScrollPanel(), GroupLayout.DEFAULT_SIZE, 378, Short.MAX_VALUE))
        );
        setLayout(groupLayout);
    }
    
    protected abstract GenericoTablaListado getTabla();
    
    protected void setTabla(GenericoTablaListado tabla) {
        this.tabla = tabla;
    }
    
    private JToolBar getBarraHerramientas() {
        if(barraHerramientas == null) {
            barraHerramientas = new JToolBar();
            
            barraHerramientas.setFloatable(false);
            agregarBotones();
        
        }
        
        return barraHerramientas;
    }
    
    private JScrollPane getScrollPanel() {
        if(scrollPanel == null) {
            scrollPanel = new JScrollPane();
            
            if(getTabla().tieneDatos()) {
                scrollPanel.setViewportView(getTabla());
            }
            else {
                scrollPanel.setViewportView(getPanelVacio());
            }
        }
        
        return scrollPanel;
    }
    
    private SeccionDescripcionPanel getDescripcionPanel() {
        if(descripcionPanel == null) {
            descripcionPanel = new SeccionDescripcionPanel(tipo);
        }
        
        return descripcionPanel;
    }
    
    private PanelTablaVacia getPanelVacio() {
        if(panelVacio == null) {
            panelVacio = new PanelTablaVacia();
        }
        
        return panelVacio;
    }
    
    private void agregarBotones() {
        List<GenericoAccion> acciones = null;
        
        if(getTabla() != null) {
            acciones = getTabla().getAcciones();
        }
        
        if(acciones != null && !acciones.isEmpty() && barraHerramientas != null) {
            for(GenericoAccion accion : getTabla().getAcciones()) {
                barraHerramientas.add(accion);
            }
        }
    }
    
    protected void agregarListenerTabla(GenericoTablaListado tabla) {
        if(tabla != null) {
            tabla.addPropertyChangeListener(new PropertyChangeListener() {
                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if(evt.getPropertyName().equals(IPropiedades.ACTUALIZAR)) {
                        actualizarPanel();
                    }
                    else if(evt.getPropertyName().equals(IPropiedades.ACTUALIZAR_BARRA)) {
                        actualizarBarra();
                    }
                }
            });
        }
    }
    
    private void actualizarPanel() {
        if(getTabla().tieneDatos()) {
            getScrollPanel().remove(getPanelVacio());
            getScrollPanel().setViewportView(getTabla());
        }
        else {
            getScrollPanel().remove(getTabla());
            getScrollPanel().setViewportView(getPanelVacio());
        }
        
        repaint();
        revalidate();
    }
    
    private void actualizarBarra() {
        JButton boton = null;
        
        for(int i = 0; i < getBarraHerramientas().getComponentCount(); i++) {
            if(getBarraHerramientas().getComponent(i) instanceof JButton) {
                boton = (JButton)(getBarraHerramientas().getComponent(i));
                
                for(GenericoAccion ga : getTabla().getAcciones()) {
                    if(boton.getAction().equals(ga)) {
                        boton.setEnabled(ga.isEnabled());
                    }
                }
            }
        }
    }
}